package cn.lycode.system.mapper;

import cn.lycode.common.core.domain.entity.SysMenu;
import cn.lycode.common.core.domain.model.ConditionDTO;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 菜单表 数据层
 *
 * @author lyCode
 */
public interface SysMenuMapper {
    /**
     * 根据角色ID查询菜单权限列表
     * @param roleName   角色名
     * @return 选中菜单列表
     */
    List<String> selectMenuPermsByRoleName(String roleName);

    /**
     * 查询前台菜单路由列表
     * @return 菜单列表
     */
    List<SysMenu> selectFrontMenuAll();

    /**
     * 根据角色名查询具有的前台菜单路由列表
     * @param roleName 角色名
     */
    List<SysMenu> selectFrontMenusByRoleName(String roleName);

    /**
     * 根据菜单ID查询信息
     *
     * @param id 菜单ID
     * @return 菜单信息
     */
    SysMenu selectMenuById(Long id);


    /**
     * 查询系统菜单列表
     *
     * @param conditionDTO 菜单信息
     * @return 菜单列表
     */
    List<SysMenu> selectMenuList(@Param("condition") ConditionDTO conditionDTO);

    /**
     * 新增菜单信息
     *
     * @param menu 菜单信息
     * @return 结果
     */
    int insertMenu(SysMenu menu);

    /**
     * 修改菜单信息
     *
     * @param menu 菜单信息
     * @return 结果
     */
    int updateMenu(SysMenu menu);

    List<SysMenu> selectAllMenuExBtn();
    List<SysMenu> selectAllMenu();

    void updateMenuAndChildrenIsDelete(List<Long> list);

    //更新层级
    void syncTreeDeep();

    //更新是否存在子菜单
    void syncTreeHasChildren();

    List<SysMenu> selectMenuByPidList(List<Long> pidList);

    int countPerms(@Param("perms") String perms, @Param("id") Long id);



    /**
     * 校验菜单名称是否唯一
     * TODO 需要校验一下菜单路由名唯一吧，不然前端会出错
     * @param menuName 菜单名称
     * @param pid 父菜单ID
     * @return 结果
     */
    SysMenu checkMenuNameUnique(@Param("menuName") String menuName, @Param("pid") Long pid);


    List<String> selectRoleNameListByMenuId(List<Long> menuIds);
}
